/**
 * 快捷键定义
 */
import { globalShortcut, ipcMain } from 'electron'
import { MessageBox } from 'app/dialog'
import { logger } from 'app/collect'
import { DEFAULT_SHORT_CUT } from './default'
import { ShortCutOption, IpcEvent } from 'app/type'

export class ShortCut {
    private static map: Map<string, ShortCutOption> = new Map()
    // 注册快捷键
    private static registerShortcut(shortcut: ShortCutOption) {
        if (globalShortcut.isRegistered(shortcut.keys)) {
            globalShortcut.unregister(shortcut.keys)
        }
        globalShortcut.register(shortcut.keys, shortcut.fn)
    }
    // 设置默认快捷键
    static reset() {
        if (DEFAULT_SHORT_CUT.length > 0) {
            for (const shortcut of DEFAULT_SHORT_CUT as ShortCutOption[]) {
                if (!ShortCut.map.has(shortcut.keys)) {
                    globalShortcut.register(shortcut.keys, shortcut.fn)
                    ShortCut.map.set(shortcut.keys, shortcut)
                }
            }
        }
    }
    // 设置快捷键
    static async setShortCut(shortcut: ShortCutOption) {
        if (!shortcut.keys || !shortcut.title || typeof shortcut.fn !== 'function') {
            logger.error(`${shortcut.keys || shortcut.title}配置项不完整！`)
            return
        }
        if (!shortcut.keys.includes('+')) {
            MessageBox.error({
                title: '错误',
                message: '仅支持组合键，不允许使用单键！',
            })
            return
        }
        const exiting = ShortCut.map.get(shortcut.keys)
        if (exiting) {
            const { response } = await MessageBox.question({
                title: '温馨提示',
                message: `此快捷键【${shortcut.keys}】已被【${exiting.title}】使用，是否确认替换？`,
                buttons: ['放弃', '替换'],
            })
            if (0 === response) {
                return
            }
        }
        ShortCut.map.set(shortcut.keys, shortcut)
        ShortCut.registerShortcut(shortcut)
    }
    // 删除快捷键
    static delShortCut(key: string) {
        if (globalShortcut.isRegistered(key)) {
            globalShortcut.unregister(key)
        }
        ShortCut.map.delete(key)
    }

    static delAllShortCut() {
        globalShortcut.unregisterAll()
        ShortCut.map.clear()
    }

    static init() {
        // 设置默认快捷键
        ShortCut.reset()
        // 设置快捷键
        ipcMain.handle(IpcEvent.APP_SHORT_CUT_SET, async (e, option: string) => {
            await ShortCut.setShortCut(JSON.parse(option))
        })

        // 删除快捷键
        ipcMain.handle(IpcEvent.APP_SHORT_CUT_DEL, async (e, key: string | 'all') => {
            if (key === 'all') {
                ShortCut.delAllShortCut()
            } else {
                ShortCut.delShortCut(key)
            }
        })
    }
}
